/*
 * @Author: your name
 * @Date: 2021-08-27 20:07:04
 * @LastEditTime: 2022-04-04 11:04:32
 * @LastEditors: Please set LastEditors
 * @Description: 使用输入法设置的设置项，默认为设置界面的通用设置项，其它输入框控件继承该类实现。
 * @FilePath: \phone\src\input_item.h
 */
#ifndef INPUT_TIEM_H
#define INPUT_TIEM_H
#include "input_method.h"
#include "item.h"
#include "page_handle.h"
#include "primary_contrl.h"
#include "second_page.h"
#define CURSOR_WIDTH 14
#define EDIT_LENGTH 12
#define MAX_INPUT_CHAR 63
class InputItem : public SecondPage, public PrimaryContrl, public Item, public InputMethod {
public:
    /**
     * @brief Construct a new Input Item object
     *
     * @param page 编辑框依赖的主界面
     * @param value 编辑框初始值
     * @param editView 编辑框操作view
     * @param commonInputItem 通用的输入设置项，true-输入框初始化时位置靠右, flase-输入框初始化时位置靠左。
     * @param editLength 编辑可见字符长度
     */
    InputItem(std::unique_ptr<Widget>& page, std::string& value, Widget* editView, bool commonInputItem = true, unsigned int editLength = EDIT_LENGTH);
    virtual ~InputItem();
    void InputInit();
    void InputInitIQ();
    void InputUnInitIQ();
    void Input(void* ctx);
    void Delete(void* ctx);
    void InputMethodChange(void* ctx);
    void ResetKeyCmd(KeyCmdMapTable& keyEvent) override;
    void SetEditText(Widget* edit, std::string value, void* ctx) override;
    void InputMethodSelection(InputMethodsType& method, InputMethodsType& lastMethod) override;
    std::string GetString() override;
    void RefreshPage() override;
    void SetOnlySupport(InputMethodsType type);
    void SaveData(void* ctx);
    /**
     * @brief Get the Value By Index object
     * 获取字符串对应下标值，密码设置项可重载返回‘*’。
     */
    virtual std::string GetValueByIndex(std::string value, unsigned int index);
    /**
     * @brief Set the Cursor Widget object
     * 设置编辑框字符属性，密码界面可重载实现多态功能。
     * @param widget
     */
    virtual void SetEditString(Widget* widget, std::string value, unsigned int index);
    std::string& GetEditValue();
    /**
     * @brief
     * 显示输入框编辑框的提示字符串译文。
     * @param inputView
     */
    void ShowEditTips(Widget* inputView);
    /**
     * @brief Set the Edit Tips object
     * 设置输入框没有字符时的提示字符。
     * @param tips
     */
    void SetEditTips(std::string tips);
    unsigned int GetEditLength();
    /**
     * @brief
     * 数据校验抽象函数，返回true会正常输入，返回false终止输入操作。
     * @param edit 当前编辑框的值。
     * @param choosing 是否正在处理可选字符，true-正在处理可选字符，此时输入框字符长度不变；false-输入框字符长度+1
     * @return true
     * @return false
     */
    virtual bool EditValueCheck(const std::string& edit, const bool& choosing)
    {
        return true;
    }

private:
    /**
     * @brief
     * 编辑框的值
     */
    std::string& editValue;
    /**
     * @brief
     * 编辑框控制view，只保存，不管理
     */
    Widget* editView;
    /**
     * @brief
     * 主要的窗口，该类依赖一个窗口，控制主窗口的某个区域。
     */
    std::unique_ptr<Widget>& primaryWidget;
    /**
     * @brief
     * 标识输入法是否已经初始化，如果已经初始化，析构时要释放相关资源。
     */
    bool inputMethodInit;
    /**
     * @brief
     * 当输入设置项只支持一种输入字符类型时使用。
     */
    InputMethodsType onlySupport;
    /**
     * @brief
     * 输入框提示译文。
     */
    std::string editTips;
    /**
     * @brief
     * 是否为通用设置项。默认为true。
     */
    const bool commonItem;
    /**
     * @brief
     * 编辑字符的长度(编辑框可见字符)
     */
    unsigned int mEditLength;
};
#endif